package com.mikao.service;

import com.mikao.dto.bo.*;
import com.mikao.dto.vo.*;

import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;

/**
 * @author KennyDavid
 */
public interface UserService {

    /**
     * 授权登录
     *
     * @param userBo 表单
     * @return user
     */
    BaseResult<UserVo> login(UserBo userBo);

    /**
     * 获取短信验证码
     *
     * @param mobile 手机号
     * @return boolean
     */
    BaseResult getVerifyCode(String mobile);

    /**
     * 绑定手机号
     *
     * @param phoneForm 手机号
     * @param userId    用户id
     * @return 封装类
     */
    BaseResult bindPhone(PhoneForm phoneForm, Long userId);

    /**
     * 首页显示
     *
     * @return 封装类
     */
    BaseResult<IndexDto> index();

    /**
     * 获取我的消息
     *
     * @param userId 用户ID
     * @return user
     */
    BaseResult<UserVo> myInfo(Long userId);

    /**
     * 积分明细
     *
     * @param userId 用户ID
     * @param type   收支类型
     * @return list
     */
    BaseResult<List<PointDto>> pointDetail(Long userId, Integer type);

    /**
     * 领取优惠券
     *
     * @param userId     用户ID
     * @param ticketForm 优惠券表单
     * @return 封装类
     */
    BaseResult getTicket(Long userId, TicketForm ticketForm);

    /**
     * 获取我的订单
     *
     * @param type       订单类型
     * @param createTime 时间
     * @param size       条数
     * @return list
     */
    BaseResult<List<OrderDto>> getMyOrder(Long userId, Integer type, Date createTime, int size);

    /**
     * 获取token
     *
     * @param id id
     * @return token
     */
    BaseResult<String> getToken(Long id);

    /**
     * 订单详情
     *
     * @param id 订单ID
     * @return 封装类
     */
    BaseResult<OrderDetailDto> getOrderDetail(Long id);

    /**
     * 获取我的收货地址列表
     *
     * @param userId 用户ID
     * @return list
     */
    BaseResult<List<AddressDto>> getMyAddress(Long userId);

    /**
     * 确认收货
     *
     * @param sureOrderForm 收货表单
     * @return 封装类
     */
    BaseResult sureOrder(Long userId, SureOrderForm sureOrderForm);

    /**
     * 微信支付
     *
     * @param userId  用户ID
     * @param payForm 支付表单
     * @return 封装类
     */
    BaseResult pay(Long userId, PayForm payForm);

    /**
     * 添加或修改银行卡
     *
     * @param bankCardForm 银行卡表单
     * @param userId       id
     * @return 封装类
     */
    BaseResult addBankCard(Long userId, BankCardForm bankCardForm);

    /**
     * 用户提现
     *
     * @param userId       用户ID
     * @param withdrawForm 提现表单
     * @return 封装类
     */
    BaseResult withdraw(Long userId, WithdrawForm withdrawForm);

    /**
     * 充值余额
     *
     * @param userId  用户ID
     * @param payForm 充值表单
     * @return 封装类
     */
    BaseResult charge(Long userId, PayForm payForm);

    /**
     * 资金明细
     *
     * @param userId 用户ID
     * @param type   类型
     * @return list
     */
    BaseResult<List<MoneyDetailDto>> moneyDetail(Long userId, Integer type);

    /**
     * 用户支付树苗
     *
     * @param userId  id
     * @param payForm form
     * @return 封装
     */
    BaseResult payTree(Long userId, PayForm payForm);

    /**
     * 添加收货地址
     *
     * @param addressForm
     * @return
     */
    BaseResult addMyAddress(Long userId, AddressForm addressForm);

    /**
     * 设置默认地址
     *
     * @param addressSelect
     * @return
     */
    BaseResult setAddress(AddressSelect addressSelect);

    /**
     * 删除地址
     *
     * @param addressSelect
     * @return
     */
    BaseResult deleteAddress(AddressSelect addressSelect);

    /**
     * 微信退款
     *
     * @param backForm
     * @return
     */
    BaseResult wxBack(BackForm backForm);

    /**
     * 修改用户信息
     *
     * @param myInfoForm
     * @return
     */
    BaseResult changeMyInfo(Long userId, MyInfoForm myInfoForm);


    /**
     * 处理微信充值支付后回调
     *
     * @param out_trade_no
     * @param total_amount
     */
    void doWxTypeBy1(String out_trade_no, String total_amount);
}
